/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.sync;

import java.net.DatagramPacket;
import java.net.InetAddress;

/**
 * This class encapsulates a NtpDatagram. See rfc2030 for more
 * details.
 * @author Hasan Bulut - hbulut@indiana.edu
 */
public class SyncDatagramPacket {
    //~ Instance fields ----------------------------------------------------------

    private int LENGTH = 8; //8 bytes per datagram of synchronism
    private DatagramPacket ntpPacket;
    private SyncInfo ntpInfo = new SyncInfo();
    private SyncTimestamp timeStamp = new SyncTimestamp();

    //~ Constructors -------------------------------------------------------------
    /**
     * Constructs a NtpDatagram with only the transmit timestamp
     * filled in (set to the current time).
     * @param header NtpHeader
     * @param iaddr InetAddress - InetAddress of the server
     * @param iport int - port number of the server
     */
    public SyncDatagramPacket(InetAddress iaddr, int iport) {
        byte[] buffer;

        SyncTimestamp ntpTS = new SyncTimestamp();
        buffer = ntpTS.getTimestampData();

        ntpPacket = new DatagramPacket(buffer, buffer.length, iaddr, iport);
    }

    /**
     * Constructs an uninitialized NtpDatagram from a UDP datagram.
     */
    public SyncDatagramPacket() {
        byte[] buffer = new byte[LENGTH];
        ntpPacket = new DatagramPacket(buffer, LENGTH);
    }

    /**
     * Constructs an uninitialized NtpDatagram from a UDP datagram.
     */
    public SyncDatagramPacket(SyncTimestamp st) {
        this.timeStamp = st;
        this.setNtpData();
    }

    /**
     * Sets the UDP packet to the given one.
     * @param dp - UDP datagram packet
     */
    public SyncDatagramPacket(DatagramPacket dp) {
        this.ntpPacket = dp;
        if (dp.getData().length == 8) {
            this.setNtpTimestamps();
        }
    }

    //~ Methods ------------------------------------------------------------------
    /**
     * Gets the UDP datagram associated to SyncDatagramPacket.
     * @return DatagramPacket - UDP datagram packet
     */
    public DatagramPacket getDatagramPacket() {
        //this.setNtpData();
        return ntpPacket;
    }

    /**
     * sets ReferenceTimeStamp, OriginateTimeStamp, ReceiveTimeStamp, TransmitTimeStamp
     * using the data value of the Ntp Packet
     */
    public void setNtpTimestamps() {
        byte[] buffer = ntpPacket.getData();
        this.timeStamp.setTimestamp(0, buffer);

    }

    /**
     * Creates a packet from the timestamp of the object
     */
    private void setNtpData() {
        this.ntpPacket = new DatagramPacket(this.timeStamp.getTimestampData(), LENGTH);

    }

    /**
     * Gets the transmit timestamp.
     * @return SyncTimestamp
     */
    public SyncTimestamp getTimeStamp() {
        this.setNtpTimestamps();
        return timeStamp;
    }

    /**
     * Sets the reception timestamp to the given SyncTimestamp object.
     * @param receptionTimeStamp SyncTimestamp
     */
    void setTimeStamp(SyncTimestamp timeStamp) {
        this.timeStamp = timeStamp;
        this.setNtpData();
    }

    /**
     * Gets SyncDatagramPacket in String format. String includes the followings:
     * Header, ReferenceTimeStamp, OriginateTimeStamp, ReceiveTimeStamp, TransmitTimeStamp
     * @return String - String representation of SyncDatagramPacket
     */
    public String toString() {
        String s;
        s = "TimeStamp : " + getTimeStamp();
        return s;
    }
}
